package com.lagou.component.decoder;

import com.alibaba.fastjson.JSON;
import com.lagou.protocol.RpcRequest;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

public class RpcRequestJsonDecoder extends ByteToMessageDecoder {

    private static final int HEAD_LENGTH = 4;

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        // 获取消息头，由于Encoder中我们传的是一个int类型的值，所以这里HEAD_LENGTH的值为4
        if (in.readableBytes() < HEAD_LENGTH) {
            return;
        }

        // 标记当前的readIndex的位置
        in.markReaderIndex();

        // 读取传送过来的消息的长度，readIndex自动增加4
        int dataLength = in.readInt();

        // 消息体长度为0，意味异常情况，直接关闭连接。
        if (dataLength < 0) {
            ctx.close();
        }

        // 读到的消息体长度如果小于我们传送过来的消息长度，即发生了半包情况
        if (in.readableBytes() < dataLength) {
            // 把readIndex重置到刚刚mark的地方，本次不处理，等消息完整了再处理
            in.resetReaderIndex();
            return;
        }

        // 传输正常
        byte[] body = new byte[dataLength];
        in.readBytes(body);

        // 将byte数据通过JSON转化为RpcRequest
        Object o = JSON.parseObject(body, RpcRequest.class);
        out.add(o);
    }
}
